﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using System.IO;

namespace GesPro
{
    /// <summary>
    /// Classe s'occupant de la gestion du classeur de rapport.
    /// </summary>
    class ClasseurRapports
    {
        /// <summary>
        /// Liste des chemises de rapport contenu dans le classeur.
        /// </summary>
        private List<ChemiseRapports> classeur = new List<ChemiseRapports>();
        /// <summary>
        /// Charger les rapports dans le classeur à partir du fichier correspondant.
        /// </summary>
        public void ChargerRapports()
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<ChemiseRapports>));
            if (!File.Exists(AccesPreferences.CheminClasseurRapports() + "\\ClasseurRapports.xml"))
            {
                using (StreamWriter writer = new StreamWriter(AccesPreferences.CheminClasseurRapports() + "\\ClasseurRapports.xml"))
                {
                    List<ChemiseRapports> liste = new List<ChemiseRapports>();

                    xmlSerializer.Serialize(writer, liste);
                }

            }

            using (StreamReader reader = new StreamReader(AccesPreferences.CheminClasseurRapports() + "\\ClasseurRapports.xml"))
            {
                classeur = xmlSerializer.Deserialize(reader) as List<ChemiseRapports>;

            }
        }
        /// <summary>
        /// Sauvegarder le classeur de rapport dans le fichier correspondant.
        /// </summary>
        public void SauvegarderRapports()
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<ChemiseRapports>));
            using (StreamWriter writer = new StreamWriter(AccesPreferences.CheminClasseurRapports() + "\\ClasseurRapports.xml"))
            {
                xmlSerializer.Serialize(writer, classeur);
            }
        }
        /// <summary>
        /// Ajouter un rapport au classeur de rapport.
        /// </summary>
        /// <param name="rapport">Rapport à ajouter.</param>
        /// <param name="semaine">Semaine du rapport.</param>
        /// <param name="annee">Année du rapport.</param>
        public void AjouterRapport(Rapport rapport, string semaine, decimal annee)
        {
            bool semaineExiste = false;
            ChargerRapports();

            rapport.Employe = Crypto.EncryptStringAES(rapport.Employe, AccesPreferences.ObtenirMotEncodage());
            foreach (SectionRapport section in rapport.Sections)
            {
                section.Problemes = Crypto.EncryptStringAES(section.Problemes, AccesPreferences.ObtenirMotEncodage());
                section.Projet = Crypto.EncryptStringAES(section.Projet, AccesPreferences.ObtenirMotEncodage());
                section.Solutions = Crypto.EncryptStringAES(section.Solutions, AccesPreferences.ObtenirMotEncodage());
                section.Taches = Crypto.EncryptStringAES(section.Taches, AccesPreferences.ObtenirMotEncodage());
            }


            foreach (ChemiseRapports chemise in classeur)
            {

                if(chemise.Semaine == semaine & chemise.Annee == annee)
                {
                    semaineExiste = true;
                    chemise.Rapports.Add(rapport);
                    break;
                }
            }
            if (!semaineExiste)
            {
                ChemiseRapports chemise = new ChemiseRapports(annee, semaine);
                chemise.Rapports.Add(rapport);

                classeur.Add(chemise);
            }

            SauvegarderRapports();

        }
        /// <summary>
        /// Obtenir la liste des rapports du classeur.
        /// </summary>
        /// <returns>Liste des rapports du classeur.</returns>
        public List<ChemiseRapports> ObtenirRapports()
        {
            ChargerRapports();

            foreach (ChemiseRapports chemise in classeur)
            {
                foreach (Rapport rapport in chemise.Rapports)
                {
                    rapport.Employe = Crypto.DecryptStringAES(rapport.Employe, AccesPreferences.ObtenirMotEncodage());
                    foreach (SectionRapport section in rapport.Sections)
                    {
                        section.Problemes = Crypto.DecryptStringAES(section.Problemes, AccesPreferences.ObtenirMotEncodage());
                        section.Projet = Crypto.DecryptStringAES(section.Projet, AccesPreferences.ObtenirMotEncodage());
                        section.Solutions = Crypto.DecryptStringAES(section.Solutions, AccesPreferences.ObtenirMotEncodage());
                        section.Taches = Crypto.DecryptStringAES(section.Taches, AccesPreferences.ObtenirMotEncodage());
                    }
                }                    
            }
            return classeur;
        
        }
        /// <summary>
        /// Obtenir les rapports d'un employé selon la période spécifié.
        /// </summary>
        /// <param name="NomEmploye">Nom de l'employé visé.</param>
        /// <param name="AnneeDebut">Année de début de la période.</param>
        /// <param name="AnneeFin">Année de fin de la période.</param>
        /// <param name="SemaineDebut">Semaine de début de la période.</param>
        /// <param name="SemaineFin">Semaine de fin de la période.</param>
        /// <returns>Liste de rapport de l'employé visé couvrant la période spécifiée.</returns>
        public List<Rapport> ObtenirRapportEmploye(string NomEmploye, int AnneeDebut, int AnneeFin, int SemaineDebut, int SemaineFin)
        {
            List<Rapport> listeRapport = new List<Rapport>();
            ChargerRapports();

            foreach (ChemiseRapports chemise in classeur)
            {
                if ((Convert.ToInt32(chemise.Annee) >= AnneeDebut & Convert.ToInt32(chemise.Semaine) >= SemaineDebut) &
                    (Convert.ToInt32(chemise.Annee) <= AnneeFin &   Convert.ToInt32(chemise.Semaine) <= SemaineFin)   )
                {
                    
                    foreach (Rapport rapport in chemise.Rapports)
                    {

                        if (Crypto.DecryptStringAES(rapport.Employe, AccesPreferences.ObtenirMotEncodage()) == NomEmploye)
                        {
                            rapport.Employe = Crypto.DecryptStringAES(rapport.Employe, AccesPreferences.ObtenirMotEncodage());
                            foreach (SectionRapport section in rapport.Sections)
                            {
                                section.Problemes = Crypto.DecryptStringAES(section.Problemes, AccesPreferences.ObtenirMotEncodage());
                                section.Projet = Crypto.DecryptStringAES(section.Projet, AccesPreferences.ObtenirMotEncodage());
                                section.Solutions = Crypto.DecryptStringAES(section.Solutions, AccesPreferences.ObtenirMotEncodage());
                                section.Taches = Crypto.DecryptStringAES(section.Taches, AccesPreferences.ObtenirMotEncodage());
                            }
                            listeRapport.Add(rapport);   
                        }

                    }

                }



            }
            return listeRapport;
        }

        /// <summary>
        /// Obtenir les rapport d'un projet particulier.
        /// </summary>
        /// <param name="NomProjet">Nom du projet visé.</param>
        /// <returns>Liste de rapports du projet visé.</returns>
        public List<Rapport> ObtenirRapportProjet(string NomProjet)
        {
            List<Rapport> listeRapport = new List<Rapport>();
            Rapport rapportProjet;
            ChargerRapports();

            foreach (ChemiseRapports chemise in classeur)
            {
                foreach (Rapport rapport in chemise.Rapports)
                {
                    foreach (SectionRapport section in rapport.Sections)
                    {
                        if (Crypto.DecryptStringAES(section.Projet, AccesPreferences.ObtenirMotEncodage()) == NomProjet)
                        {
                            rapportProjet = new Rapport(Crypto.DecryptStringAES(rapport.Employe, AccesPreferences.ObtenirMotEncodage())
                                                        , rapport.Date);
                            section.Problemes = Crypto.DecryptStringAES(section.Problemes, AccesPreferences.ObtenirMotEncodage());
                            section.Projet = Crypto.DecryptStringAES(section.Projet, AccesPreferences.ObtenirMotEncodage());
                            section.Solutions = Crypto.DecryptStringAES(section.Solutions, AccesPreferences.ObtenirMotEncodage());
                            section.Taches = Crypto.DecryptStringAES(section.Taches, AccesPreferences.ObtenirMotEncodage());

                            rapportProjet.Sections.Add(section);
                            listeRapport.Add(rapportProjet);
                        }
                    }
                }
            }
            return listeRapport;
        }

        /// <summary>
        /// Recrypter le classeur avec un nouveau mot de passe dans les préférences
        /// </summary>
        /// <param name="OldMotEncodage">Ancien mot de passe</param>
        public void RecrypterClasseur(string OldMotEncodage)
        {
            ChargerRapports();

            foreach (ChemiseRapports chemise in classeur)
            {
                foreach (Rapport rapport in chemise.Rapports)
                {
                    foreach (SectionRapport section in rapport.Sections)
                    {
                        section.Projet = Crypto.EncryptStringAES(Crypto.DecryptStringAES(section.Projet , OldMotEncodage), AccesPreferences.ObtenirMotEncodage());
                        section.Taches = Crypto.EncryptStringAES(Crypto.DecryptStringAES(section.Taches, OldMotEncodage), AccesPreferences.ObtenirMotEncodage());
                        section.Problemes = Crypto.EncryptStringAES(Crypto.DecryptStringAES(section.Problemes, OldMotEncodage), AccesPreferences.ObtenirMotEncodage());
                        section.Solutions = Crypto.EncryptStringAES(Crypto.DecryptStringAES(section.Solutions, OldMotEncodage), AccesPreferences.ObtenirMotEncodage());
                    }

                }

            }
            SauvegarderRapports();
        }


    }
}
